home *** CD-ROM | disk | FTP | other *** search
Text File | 1980-01-04 | 22.7 KB | 1,159 lines |
-
- section "player",code_p
-
- ;------------------------------------------------------------------------------
- ; TEST PLAYING
- ;------------------------------------------------------------------------------
-
- testplay
- bsr.w mt_init
-
- lea $dff000,a6
- move.w $1c(a6),d0
- move.w #$3fff,$9a(a6) ;kill interupts
-
- waitbutt
- cmp.b #-1,6(a6)
- bne.b waitbutt
-
- movem.l d0/a6,-(a7)
- bsr.w mt_music
- movem.l (a7)+,d0/a6
-
- btst #6,$bfe001
- bne.b waitbutt
-
- move.w #$7fff,$9a(a6)
- bset #15,d0
- move.w d0,$9a(a6)
-
- bra.w mt_end
-
- ;------------------------------------------------------------------------------
- ; PROMIZER PLAYER V0.1a ... MAY 1992
- ;------------------------------------------------------------------------------
- ; coded by MC68000 of TECH
- ; Frank Hülsmann
- ; Timmerscheidtstr. 14
- ; 4400 Münster/Germany
- ;------------------------------------------------------------------------------
- ;
- ; MODIFY 'mt_maxvol' (0-64 ... size : byte) TO SET MAXIMUM ABSOLUT VOLUME !!!
- ;
- ; THIS PLAYER WORKS WITH FINETUNED SAMPLES BY USING A MINIMUM OF RASTER TIME !!
- ; THE CODE BASED ON THE PROTRACKER V1.1b REPLAYER BY ZAP/AMIGA FREELANCERS, BUT
- ; IT'S MAX.400% FASTER AND FULLY PC-RELOCATIBLE ...
- ;
- ;------------------------------------------------------------------------------
-
- mt_level6=1 ;1=level 6 interupt on (faster dmareg. init)
- mt_dmawaiter=3 ;no.of rasterlines waiting for dma
-
- ; INIT_PLAYING ----------------------------------------------------------------
-
- mt_init movem.l d0-a6,-(a7)
- lea mt_pm(pc),a5
- move.l mt_dataptr(pc),a0
-
- lea 762(a0),a1 ;patternlenght
- move.l (a1)+,d0
- add.l d0,a1 ;samplestarts
-
- lea mt_samplestarts(pc),a2
- moveq #30,d1
- mt_samploop
- moveq #0,d0
- move.w (a0),d0 ;samplelength in words
- add.l d0,d0 ;samplelength in bytes
- move.l a1,(a2)+ ;save sample adress
- add.l d0,a1 ;next sample
- addq.l #8,a0 ;next sample info
- dbf d1,mt_samploop
-
- or.b #2,$bfe001 ;filter off
- move.b #6,mt_speed-mt_pm(a5)
- clr.b mt_counter-mt_pm(a5)
- clr.w mt_songpos-mt_pm(a5)
- clr.w mt_patternpos-mt_pm(a5)
- move.l $78.w,mt_oldirq-mt_pm(a5) ;save old_irq
- lea $dff096,a0
- clr.w $a8-$96(a0)
- clr.w $b8-$96(a0)
- clr.w $c8-$96(a0)
- clr.w $d8-$96(a0) ;volume voice 1-4 = 0
- moveq #$f,d0
- move.w d0,(a0) ;no sound_dma
-
- ; CREATE PERIOD MULTAB (FOR FASTER FINE_TUNING)
-
- moveq #15,d7
- moveq #0,d0
- moveq #72,d1
- mt_mulloop2
- move.w d0,(a5)+
- add.w d1,d0
- dbf d7,mt_mulloop2
-
- ; CALCULATE RELATIVE JUMP ADRESSES IN JUMPTABS (FOR PC-COMPATIBLE CODE !!!)
-
- lea mt_init(pc),a0
- move.l a0,d0
- lea mt_jumptab1(pc),a0
- lea mt_jumptab2(pc),a1
- lea mt_jumptab3(pc),a2
- lea mt_jumptab4(pc),a3
- moveq #15,d1
- mt_jumpcalcloop
- add.l d0,(a0)+
- add.l d0,(a1)+
- add.l d0,(a2)+
- add.l d0,(a3)+
- dbf d1,mt_jumpcalcloop
-
- if mt_level6=1
- lea mt_irqpointer(pc),a0
- add.l d0,(a0)
- endc
-
- movem.l (a7)+,d0-a6
- rts
-
- ; END_PLAYING -----------------------------------------------------------------
-
- mt_end movem.l d0/a0,-(a7)
- move.l mt_oldirq(pc),$78.w
- lea $dff096,a0
- clr.w $a8-$96(a0)
- clr.w $b8-$96(a0)
- clr.w $c8-$96(a0)
- clr.w $d8-$96(a0)
- moveq #$f,d0
- move.w d0,(a0)
- movem.l (a7)+,d0/a0
- rts
-
- ; SOUND_PLAYER ---------------------------------------------------------------
-
- ; kills d0-d7/a0-a6 !!!!
-
- mt_music
- moveq #$f,d5 ;ander com_low
- moveq #-16,d6 ;ander com
- lea mt_pm(pc),a2
-
- addq.b #1,mt_counter-mt_pm(a2)
- move.b mt_counter-mt_pm(a2),d0
- cmp.b mt_speed-mt_pm(a2),d0
- blo.b mt_nonewallchannels
- clr.b mt_counter-mt_pm(a2)
- tst.b mt_pattdeltime2-mt_pm(a2)
- beq.b mt_getnewnote
- bsr.b mt_nonewallchannels
- bra.w mt_dskip
-
- mt_nonewallchannels
- lea $dff0a0,a5
- lea mt_chan1temp(pc),a6
- bsr.w mt_checkefx
- lea $10(a5),a5
- lea 48(a6),a6
- bsr.w mt_checkefx
- lea $10(a5),a5
- lea 48(a6),a6
- bsr.w mt_checkefx
- lea $10(a5),a5
- lea 48(a6),a6
- bsr.w mt_checkefx
- bra.w mt_nonewposyet
-
- mt_getnewnote
- move.l mt_dataptr(pc),a0
- move.l a0,a3 ;sample infos
- lea 250(a0),a4 ;patterpositions
- lea 766(a0),a0 ;patterndata
- moveq #0,d1
- move.w mt_songpos(pc),d0
- move.l (a4,d0.w),d1
- add.w mt_patternpos(pc),d1
-
- clr.w mt_dmacontemp-mt_pm(a2)
-
- lea $dff0a0,a5
- lea mt_chan1temp(pc),a6
- bsr.b mt_playvoice
- lea $10(a5),a5
- lea 48(a6),a6
- bsr.b mt_playvoice
- lea $10(a5),a5
- lea 48(a6),a6
- bsr.b mt_playvoice
- lea $10(a5),a5
- lea 48(a6),a6
- bsr.b mt_playvoice
- bra.w mt_setdma
-
- mt_playvoice
- tst.l (a6)
- bne.b mt_plvskip
- bsr.w mt_pernop
- mt_plvskip
- move.l (a0,d1.l),d2
- eor.l d6,d2
- move.l d2,(a6)
- addq.l #4,d1
- moveq #0,d2
- move.l d2,d3
- move.b 2(a6),d2
- lsr.b #4,d2
- move.b (a6),d0
- and.b d6,d0
- or.b d0,d2
- beq.w mt_setregs
- lea mt_samplestarts(pc),a1
- subq.w #1,d2
- lsl.w #2,d2
- move.w d2,d4
- add.w d4,d4
- move.w (a3,d4.w),8(a6)
- move.w (a3,d4.w),40(a6) ;sample lenght in words
- move.l (a1,d2.w),4(a6) ;sample adress
-
- moveq #0,d0
- move.b 2(a3,d4.w),d0
- move.b d0,18(a6) ;set finetune number
- add.w d0,d0
- move.w (a2,d0.w),d0
- lea mt_periodtable(pc),a4
- add.l d0,a4
- move.l a4,44(a6) ;save periodtable
-
-
- move.b 3(a3,d4.w),d0 ;sample volume
- cmp.b mt_maxvol(pc),d0
- bls.b mt_nv
- move.b mt_maxvol(pc),d0 ;cut volume -> no relative
- mt_nv ;calculation here ...
- move.b d0,19(a6)
-
- move.w 4(a3,d4.w),d3 ;get repeat
- beq.b mt_noloop
- move.l 4(a6),d2 ;get start
- add.w d3,d3
- add.l d3,d2 ;add repeat
- move.l d2,10(a6)
- move.l d2,36(a6)
- move.w 4(a3,d4.w),d0 ;get repeat
- add.w 6(a3,d4.w),d0 ;add replen
- move.w d0,8(a6)
- move.w 6(a3,d4.w),14(a6) ;save replen
- move.b 19(a6),9(a5) ;init volume
- bra.b mt_setregs
- mt_noloop
- move.l 4(a6),d2
- add.l d3,d2
- move.l d2,10(a6)
- move.l d2,36(a6)
- move.w 6(a3,d4.w),14(a6) ;save replen
- move.b 19(a6),9(a5)
- mt_setregs
- move.w (a6),d0
- and.w #$0fff,d0
- beq.w mt_checkmoreefx ;if no note
- move.w 2(a6),d0
- and.w #$0ff0,d0
- cmp.w #$0e50,d0
- beq.b mt_dosetfinetune
- moveq #0,d0
- move.b 2(a6),d0
- and.b d5,d0
- lsl.b #2,d0
- move.l mt_jumptab3(pc,d0.w),a4
- jmp (a4)
-
- mt_jumptab3
- dcb.l 3,mt_setperiod-mt_init
- dc.l mt_chktoneporta-mt_init,mt_setperiod-mt_init
- dc.l mt_chktoneporta-mt_init
- dcb.l 3,mt_setperiod-mt_init
- dc.l mt_moreplusperiod-mt_init
- dcb.l 7,mt_setperiod-mt_init
-
- mt_moreplusperiod
- bsr.w mt_checkmoreefx
- bra.b mt_setperiod
-
- mt_dosetfinetune
- bsr.w mt_setfinetune
- bra.b mt_setperiod
-
- mt_chktoneporta
- bsr.w mt_settoneporta
- bra.w mt_checkmoreefx
-
- mt_setperiod
- move.w (a6),d2
- and.w #$0fff,d2 ; period 'ausanden'
- move.w d2,16(a6) ; set normal period
- move.w 2(a6),d0
- and.w #$0ff0,d0
- cmp.w #$0ed0,d0 ; notedelay
- beq.w mt_checkmoreefx
-
- move.w 20(a6),$dff096
- btst #2,30(a6)
- bne.b mt_vibnoc
- clr.b 27(a6)
- mt_vibnoc
- btst #6,30(a6)
- bne.b mt_trenoc
- clr.b 29(a6)
- mt_trenoc
- move.l 4(a6),(a5) ; init start
- move.w 8(a6),4(a5) ; init length
- move.w 16(a6),6(a5) ; init period
-
- move.w 20(a6),d0
- or.w d0,mt_dmacontemp-mt_pm(a2)
- bra.w mt_checkmoreefx
-
- mt_setdma
- if mt_level6=0
- bsr.w mt_dmawait
- move.w mt_dmacontemp(pc),d0
- or.w #$8000,d0
- move.w d0,$dff096
- bsr.w mt_dmawait
- lea $dff0a0,a5
- lea mt_chan1temp(pc),a6
- move.l 10(a6),(a5)
- move.w 14(a6),4(a5)
- move.l 58(a6),$10(a5)
- move.w 62(a6),$14(a5)
- move.l 106(a6),$20(a5)
- move.w 110(a6),$24(a5)
- move.l 154(a6),$30(a5)
- move.w 158(a6),$34(a5)
- else
-
- lea $bfd000,a3
- move.b #$7f,$d00(a3)
- move.w #$2000,$dff09c
- move.w #$a000,$dff09a
- lea mt_irq1(pc),a4
- move.l a4,$78.w
- moveq #0,d0
- move.b d0,$e00(a3)
- move.b #$a8,$400(a3)
- move.b d0,$500(a3)
- move.b #$11,$e00(a3)
- move.b #$81,$d00(a3)
- or.w #$8000,mt_dmacontemp-mt_pm(a2)
- bra.w mt_dskip
-
-
- mt_irq1
- tst.b $bfdd00
- move.w mt_dmacontemp(pc),$dff096
- move.w #$2000,$dff09c
- move.l mt_irqpointer(pc),$78.w
- rte
-
- mt_irqpointer dc.l mt_irq2-mt_init
-
- mt_irq2
- tst.b $bfdd00
- movem.l a5-a6,-(a7)
-
- lea $dff0a0,a5
- lea mt_chan1temp(pc),a6
- move.l 10(a6),(a5)
- move.w 14(a6),4(a5)
- move.l 58(a6),$10(a5)
- move.w 62(a6),$14(a5)
- move.l 106(a6),$20(a5)
- move.w 110(a6),$24(a5)
- move.l 154(a6),$30(a5)
- move.w 158(a6),$34(a5)
- clr.b $bfde00
- move.b #$7f,$bfdd00
- move.w #$2000,$dff09c
- movem.l (a7)+,a5-a6
- rte
- endc
-
- mt_dskip
- add.w #16,mt_patternpos-mt_pm(a2)
- move.b mt_pattdeltime(pc),d0
- beq.b mt_dskc
- move.b d0,mt_pattdeltime2-mt_pm(a2)
- clr.b mt_pattdeltime-mt_pm(a2)
- mt_dskc tst.b mt_pattdeltime2-mt_pm(a2)
- beq.b mt_dska
- subq.b #1,mt_pattdeltime2-mt_pm(a2)
- beq.b mt_dska
- sub.w #16,mt_patternpos-mt_pm(a2)
- mt_dska tst.b mt_pbreakflag-mt_pm(a2)
- beq.b mt_nnpysk
- sf mt_pbreakflag-mt_pm(a2)
- moveq #0,d0
- move.b mt_pbreakpos(pc),d0
- clr.b mt_pbreakpos-mt_pm(a2)
- lsl.w #4,d0
- move.w d0,mt_patternpos-mt_pm(a2)
- mt_nnpysk
- cmp.w #1024,mt_patternpos-mt_pm(a2)
- blo.b mt_nonewposyet
- mt_nextposition
- moveq #0,d0
- move.b mt_pbreakpos(pc),d0
- lsl.w #4,d0
- move.w d0,mt_patternpos-mt_pm(a2)
- clr.b mt_pbreakpos-mt_pm(a2)
- clr.b mt_posjumpflag-mt_pm(a2)
- addq.w #4,mt_songpos-mt_pm(a2)
- and.w #511,mt_songpos-mt_pm(a2)
- move.w mt_songpos(pc),d1
- move.l mt_dataptr(pc),a0
- cmp.w 248(a0),d1
- blo.b mt_nonewposyet
- clr.w mt_songpos-mt_pm(a2)
- mt_nonewposyet
- tst.b mt_posjumpflag-mt_pm(a2)
- bne.b mt_nextposition
- rts
-
- mt_checkefx
- bsr.w mt_updatefunk
- move.w 2(a6),d0
- and.w #$0fff,d0
- beq.b mt_pernop
- moveq #0,d0
- move.b 2(a6),d0
- and.b d5,d0
- move.w d0,d2
- lsl.b #2,d2
- move.l mt_jumptab1(pc,d2.w),a4
- jmp (a4)
-
- mt_jumptab1
- dc.l mt_arpeggio-mt_init,mt_portaup-mt_init,mt_portadown-mt_init
- dc.l mt_toneportamento-mt_init
- dc.l mt_vibrato-mt_init,mt_toneplusvolslide-mt_init
- dc.l mt_vibratoplusvolslide-mt_init
- dcb.l 7,mt_setback-mt_init
- dc.l mt_e_commands-mt_init,mt_setback-mt_init
-
- mt_setback
- move.w 16(a6),6(a5)
- subq.b #7,d0
- beq.w mt_tremolo
- subq.b #3,d0
- beq.w mt_volumeslide
- mt_return2
- rts
-
- mt_pernop
- move.w 16(a6),6(a5)
- rts
-
- mt_arpeggio
- moveq #0,d0
- move.b mt_counter(pc),d0
- moveq #3,d2
- divs d2,d0
- swap d0
- tst.w d0
- beq.b mt_arpeggio2
- subq.w #2,d0
- beq.b mt_arpeggio1
- moveq #0,d0
- move.b 3(a6),d0
- lsr.b #4,d0
- bra.b mt_arpeggio3
-
- mt_arpeggio1
- moveq #0,d0
- move.b 3(a6),d0
- and.b d5,d0
- bra.b mt_arpeggio3
-
- mt_arpeggio2
- move.w 16(a6),d2
- bra.b mt_arpeggio4
-
- mt_arpeggio3
- add.w d0,d0
- move.l 44(a6),a0
- moveq #36,d7
- mt_arploop
- move.w (a0,d0.w),d2
- cmp.w (a0),d1
- bhs.b mt_arpeggio4
- addq.l #2,a0
- dbf d7,mt_arploop
- rts
-
- mt_arpeggio4
- move.w d2,6(a5)
- rts
-
- mt_fineportaup
- tst.b mt_counter-mt_pm(a2)
- bne.b mt_return2
- move.b d1,mt_lowmask-mt_pm(a2)
- mt_portaup
- moveq #0,d0
- move.b 3(a6),d0
- and.b mt_lowmask(pc),d0
- move.b #$ff,mt_lowmask-mt_pm(a2)
- sub.w d0,16(a6)
- move.w 16(a6),d0
- and.w #$0fff,d0
- cmp.w #113,d0
- bhi.b mt_portauskip
- and.w #$f000,16(a6)
- or.w #113,16(a6)
- mt_portauskip
- move.w 16(a6),d0
- and.w #$0fff,d0
- move.w d0,6(a5)
- rts
-
- mt_fineportadown
- tst.b mt_counter-mt_pm(a2)
- bne.w mt_return2
- move.b d5,mt_lowmask-mt_pm(a2)
- mt_portadown
- moveq #0,d0
- move.b 3(a6),d0
- and.b mt_lowmask(pc),d0
- move.b #$ff,mt_lowmask-mt_pm(a2)
- add.w d0,16(a6)
- move.w 16(a6),d0
- and.w #$0fff,d0
- cmp.w #856,d0
- blo.b mt_portadskip
- and.w #$f000,16(a6)
- or.w #856,16(a6)
- mt_portadskip
- move.w 16(a6),d0
- and.w #$0fff,d0
- move.w d0,6(a5)
- rts
-
- mt_settoneporta
- move.w (a6),d2
- and.w #$0fff,d2
- move.l 44(a6),a4
- moveq #0,d0
- mt_stploop
- cmp.w (a4,d0.w),d2
- bhs.b mt_stpfound
- addq.w #2,d0
- cmp.w #37*2,d0
- blo.b mt_stploop
- moveq #35*2,d0
- mt_stpfound
- move.b 18(a6),d2
- and.b #8,d2
- beq.b mt_stpgoss
- tst.w d0
- beq.b mt_stpgoss
- subq.w #2,d0
- mt_stpgoss
- move.w (a4,d0.w),d2
- move.w d2,24(a6)
- move.w 16(a6),d0
- clr.b 22(a6)
- cmp.w d0,d2
- beq.b mt_cleartoneporta
- bge.w mt_return2
- move.b #1,22(a6)
- rts
-
- mt_cleartoneporta
- clr.w 24(a6)
- rts
-
- mt_toneportamento
- move.b 3(a6),d0
- beq.b mt_toneportnochange
- move.b d0,23(a6)
- clr.b 3(a6)
- mt_toneportnochange
- tst.w 24(a6)
- beq.w mt_return2
- moveq #0,d0
- move.b 23(a6),d0
- tst.b 22(a6)
- bne.b mt_toneportaup
- mt_toneportadown
- add.w d0,16(a6)
- move.w 24(a6),d0
- cmp.w 16(a6),d0
- bgt.b mt_toneportasetper
- move.w 24(a6),16(a6)
- clr.w 24(a6)
- bra.b mt_toneportasetper
-
- mt_toneportaup
- sub.w d0,16(a6)
- move.w 24(a6),d0
- cmp.w 16(a6),d0
- blt.b mt_toneportasetper
- move.w 24(a6),16(a6)
- clr.w 24(a6)
-
- mt_toneportasetper
- move.w 16(a6),d2
- move.b 31(a6),d0
- and.b d5,d0
- beq.b mt_glissskip
-
- move.l 44(a6),a0
- moveq #35,d7
- mt_glissloop
- cmp.w (a0)+,d2
- bge.b mt_glissfound
- dbf d7,mt_glissloop
- subq.l #2,a0
- mt_glissfound
- move.w -2(a0),d2
- mt_glissskip
- move.w d2,6(a5) ; set period
- rts
-
- mt_vibrato
- move.b 3(a6),d0
- beq.b mt_vibrato2
- move.b 26(a6),d2
- and.b d5,d0
- beq.b mt_vibskip
- and.b d6,d2
- or.b d0,d2
- mt_vibskip
- move.b 3(a6),d0
- and.b d6,d0
- beq.b mt_vibskip2
- and.b d5,d2
- or.b d0,d2
- mt_vibskip2
- move.b d2,26(a6)
- mt_vibrato2
- move.b 27(a6),d0
- lea mt_vibratotable(pc),a4
- lsr.w #2,d0
- and.w #$001f,d0
- moveq #0,d2
- move.b 30(a6),d2
- and.b #$03,d2
- beq.b mt_vib_sine
- lsl.b #3,d0
- cmp.b #1,d2
- beq.b mt_vib_rampdown
- moveq #-1,d2
- bra.b mt_vib_set
- mt_vib_rampdown
- tst.b 27(a6)
- bpl.b mt_vib_rampdown2
- moveq #-1,d2
- sub.b d0,d2
- bra.b mt_vib_set
- mt_vib_rampdown2
- move.b d0,d2
- bra.b mt_vib_set
- mt_vib_sine
- move.b (a4,d0.w),d2
- mt_vib_set
- move.b 26(a6),d0
- and.w d5,d0
- mulu d0,d2
- lsr.w #7,d2
- move.w 16(a6),d0
- tst.b 27(a6)
- bmi.b mt_vibratoneg
- add.w d2,d0
- bra.b mt_vibrato3
- mt_vibratoneg
- sub.w d2,d0
- mt_vibrato3
- move.w d0,6(a5)
- move.b 26(a6),d0
- lsr.w #2,d0
- and.w #$003c,d0
- add.b d0,27(a6)
- rts
-
- mt_toneplusvolslide
- bsr.w mt_toneportnochange
- bra.w mt_volumeslide
-
- mt_vibratoplusvolslide
- bsr.b mt_vibrato2
- bra.w mt_volumeslide
-
- mt_tremolo
- move.b 3(a6),d0
- beq.b mt_tremolo2
- move.b 28(a6),d2
- and.b d5,d0
- beq.b mt_treskip
- and.b d6,d2
- or.b d0,d2
- mt_treskip
- move.b 3(a6),d0
- and.b d6,d0
- beq.b mt_treskip2
- and.b d5,d2
- or.b d0,d2
- mt_treskip2
- move.b d2,28(a6)
- mt_tremolo2
- move.b 29(a6),d0
- lea mt_vibratotable(pc),a4
- lsr.w #2,d0
- moveq #$1f,d2
- and.w d2,d0
- move.b 30(a6),d2
- and.w d6,d2
- lsr.b #4,d2
- and.b #$03,d2
- beq.b mt_tre_sine
- lsl.b #3,d0
- cmp.b #1,d2
- beq.b mt_tre_rampdown
- moveq #-1,d2
- bra.b mt_tre_set
- mt_tre_rampdown
- tst.b 27(a6)
- bpl.b mt_tre_rampdown2
- moveq #-1,d2
- sub.b d0,d2
- bra.b mt_tre_set
- mt_tre_rampdown2
- move.b d0,d2
- bra.b mt_tre_set
- mt_tre_sine
- move.b (a4,d0.w),d2
- mt_tre_set
- move.b 28(a6),d0
- and.w d5,d0
- mulu d0,d2
- lsr.w #6,d2
- moveq #0,d0
- move.b 19(a6),d0
- tst.b 29(a6)
- bmi.b mt_tremoloneg
- add.w d2,d0
- bra.b mt_tremolo3
- mt_tremoloneg
- sub.w d2,d0
- mt_tremolo3
- bpl.b mt_tremoloskip
- moveq #0,d0
- mt_tremoloskip
- cmp.b mt_maxvol(pc),d0
- bls.b mt_tremolook
- move.b mt_maxvol(pc),d0
- mt_tremolook
- move.b d0,9(a5)
- move.b 28(a6),d0
- lsr.w #2,d0
- and.w #$003c,d0
- add.b d0,29(a6)
- rts
-
- mt_sampleoffset
- moveq #0,d0
- move.b 3(a6),d0
- beq.b mt_sononew
- move.b d0,32(a6)
- mt_sononew
- move.b 32(a6),d0
- lsl.w #7,d0
- cmp.w 8(a6),d0
- bge.b mt_sofskip
- sub.w d0,8(a6)
- add.w d0,d0
- add.l d0,4(a6)
- rts
- mt_sofskip
- move.w #1,8(a6)
- rts
-
- mt_volumeslide
- move.b 3(a6),d0
- lsr.b #4,d0
- beq.b mt_volslidedown
- mt_volslideup
- add.b d0,19(a6)
- move.b mt_maxvol(pc),d2
- cmp.b 19(a6),d2
- bge.b mt_vsuskip
- move.b d2,19(a6)
- mt_vsuskip
- move.b 19(a6),9(a5)
- rts
-
- mt_volslidedown
- move.b 3(a6),d0
- and.b d5,d0
- mt_volslidedown2
- sub.b d0,19(a6)
- bpl.b mt_vsdskip
- clr.b 19(a6)
- mt_vsdskip
- move.b 19(a6),9(a5)
- rts
-
- mt_positionjump
- moveq #0,d0
- move.b 3(a6),d0
- subq.b #1,d0
- lsl.w #2,d0
- move.w d0,mt_songpos-mt_pm(a2)
- mt_pj2 clr.b mt_pbreakpos-mt_pm(a2)
- st mt_posjumpflag-mt_pm(a2)
- rts
-
- mt_volumechange
- move.b 3(a6),d0
- cmp.b mt_maxvol(pc),d0
- ble.b mt_volumeok
- move.b mt_maxvol(pc),d0
- mt_volumeok
- move.b d0,19(a6)
- move.b d0,9(a5)
- rts
-
- mt_patternbreak
- move.b 3(a6),d0
- move.b d0,d2
- lsr.b #4,d0
- move.b d0,d1
- add.b d0,d0 ;*2
- lsl.b #3,d1 ;*8
- add.b d1,d0 ;+ -> *10
- and.b d5,d2
- add.b d2,d0
- cmp.b #63,d0
- bhi.b mt_pj2
- move.b d0,mt_pbreakpos-mt_pm(a2)
- st mt_posjumpflag-mt_pm(a2)
- rts
-
- mt_setspeed
- move.b 3(a6),d0
- beq.w mt_return2
- clr.b mt_counter-mt_pm(a2)
- move.b d0,mt_speed-mt_pm(a2)
- rts
-
- mt_checkmoreefx
- bsr.w mt_updatefunk
- moveq #0,d0
- move.b 2(a6),d0
- and.b d5,d0
- lsl.b #2,d0
- move.l mt_jumptab4(pc,d0.w),a4
- jmp (a4)
-
- mt_jumptab4
- dcb.l 9,mt_pernop-mt_init
- dc.l mt_sampleoffset-mt_init,mt_pernop-mt_init
- dc.l mt_positionjump-mt_init
- dc.l mt_volumechange-mt_init,mt_patternbreak-mt_init
- dc.l mt_e_commands-mt_init,mt_setspeed-mt_init,mt_pernop-mt_init
-
- mt_e_commands
- moveq #0,d0
- move.b 3(a6),d0
- lsr.b #4,d0
- lsl.b #2,d0
- move.l mt_jumptab2(pc,d0.w),a4
- jmp (a4)
-
- mt_jumptab2
- dc.l mt_filteronoff-mt_init,mt_fineportaup-mt_init
- dc.l mt_fineportadown-mt_init
- dc.l mt_setglisscontrol-mt_init,mt_setvibratocontrol-mt_init
- dc.l mt_setfinetune-mt_init
- dc.l mt_jumploop-mt_init,mt_settremolocontrol-mt_init
- dc.l mt_return2-mt_init,mt_retrignote-mt_init
- dc.l mt_volumefineup-mt_init
- dc.l mt_volumefinedown-mt_init,mt_notecut-mt_init
- dc.l mt_notedelay-mt_init
- dc.l mt_patterndelay-mt_init,mt_funkit-mt_init
-
- mt_filteronoff
- move.b 3(a6),d0
- and.b #1,d0
- add.w d0,d0
- and.b #$fd,$bfe001
- or.b d0,$bfe001
- rts
-
- mt_setglisscontrol
- move.b 3(a6),d0
- and.b d5,d0
- and.b d6,31(a6)
- or.b d0,31(a6)
- rts
-
- mt_setvibratocontrol
- move.b 3(a6),d0
- and.b d5,d0
- and.b d6,30(a6)
- or.b d0,30(a6)
- rts
-
- mt_setfinetune
- moveq #0,d0
- move.b 3(a6),d0
- and.b d5,d0
- move.b d0,18(a6)
- add.w d0,d0
- move.w (a2,d0.w),d0
- lea mt_periodtable(pc),a4
- add.l d0,a4
- move.l a4,44(a6)
- rts
-
- mt_jumploop
- move.b mt_counter(pc),d1
- bne.w mt_return2
- move.b 3(a6),d0
- and.b d5,d0
- beq.b mt_setloop
- tst.b 34(a6)
- beq.b mt_jumpcnt
- subq.b #1,34(a6)
- beq.w mt_return2
- mt_jmploop
- move.b 33(a6),mt_pbreakpos-mt_pm(a2)
- st mt_pbreakflag-mt_pm(a2)
- rts
-
- mt_jumpcnt
- move.b d0,34(a6)
- bra.b mt_jmploop
-
- mt_setloop
- move.w mt_patternpos(pc),d0
- lsr.w #4,d0
- move.b d0,33(a6)
- rts
-
- mt_settremolocontrol
- move.b 3(a6),d0
- and.b d5,d0
- lsl.b #4,d0
- and.b d5,30(a6)
- or.b d0,30(a6)
- rts
-
- mt_retrignote
- move.b 3(a6),d0
- and.b d5,d0
- beq.b mt_rtnend
- moveq #0,d2
- move.b mt_counter(pc),d2
- bne.b mt_rtnskp
- move.w (a6),d2
- and.w #$0fff,d2
- bne.b mt_rtnend
- moveq #0,d2
- move.b mt_counter(pc),d2
- mt_rtnskp
- divu d0,d2
- swap d2
- tst.w d2
- bne.b mt_rtnend
- mt_doretrig
- move.w 20(a6),$dff096 ; channel dma off
- move.l 4(a6),(a5) ; set sampledata pointer
- move.w 8(a6),4(a5) ; set length
- bsr.w mt_dmawait
- move.w 20(a6),d0
- or.w #$8000,d0
- move.w d0,$dff096
- bsr.w mt_dmawait
- move.l 10(a6),(a5)
- move.l 14(a6),4(a5)
- mt_rtnend
- rts
-
- mt_volumefineup
- move.b mt_counter(pc),d1
- bne.w mt_return2
- move.b 3(a6),d0
- and.b d5,d0
- bra.w mt_volslideup
-
- mt_volumefinedown
- move.b mt_counter(pc),d1
- bne.w mt_return2
- move.b 3(a6),d0
- and.b d5,d0
- bra.w mt_volslidedown2
-
- mt_notecut
- cmp.b mt_counter(pc),d0
- bne.w mt_return2
- clr.b 19(a6)
- clr.w 8(a5)
- rts
-
- mt_notedelay
- move.b 3(a6),d0
- and.b d5,d0
- cmp.b mt_counter(pc),d0
- bne.w mt_return2
- move.w (a6),d0
- beq.w mt_return2
- bra.b mt_doretrig
-
- mt_patterndelay
- move.b mt_counter(pc),d1
- bne.w mt_return2
- move.b mt_pattdeltime2(pc),d1
- bne.w mt_return2
- move.b 3(a6),d0
- and.b d5,d0
- addq.b #1,d0
- move.b d0,mt_pattdeltime-mt_pm(a2)
- rts
-
- mt_funkit
- move.b mt_counter(pc),d1
- bne.w mt_return2
- move.b 3(a6),d0
- and.b d5,d0
- lsl.b #4,d0
- and.b d5,31(a6)
- or.b d0,31(a6)
- tst.b d0
- beq.w mt_return2
- mt_updatefunk
- moveq #0,d0
- move.b 31(a6),d0
- lsr.b #4,d0
- beq.b mt_funkend
- lea mt_funktable(pc),a4
- move.b (a4,d0.w),d0
- add.b d0,35(a6)
- btst #7,35(a6)
- beq.b mt_funkend
- clr.b 35(a6)
-
- move.l 10(a6),d0
- moveq #0,d2
- move.w 14(a6),d2
- add.w d2,d2
- add.l d2,d0
- move.l 36(a6),a4
- addq.l #1,a4
- cmp.l d0,a4
- blo.b mt_funkok
- move.l 10(a6),a4
- mt_funkok
- move.l a4,36(a6)
- moveq #-1,d0
- sub.b (a4),d0
- move.b d0,(a4)
- mt_funkend
- rts
-
- mt_dmawait
- if mt_dmawaiter>0
- moveq #mt_dmawaiter-1,d4
- mt_waitdma2
- move.b $dff006,d3
- mt_waitdma3
- cmp.b $dff006,d3
- beq.b mt_waitdma3
- dbf d4,mt_waitdma2 ;wait some rasters
- endc
- rts
-
- mt_funktable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
- mt_vibratotable dc.b 0, 24, 49, 74, 97,120,141,161
- dc.b 180,197,212,224,235,244,250,253
- dc.b 255,253,250,244,235,224,212,197
- dc.b 180,161,141,120, 97, 74, 49, 24
- mt_periodtable dc.w 856,808,762,720,678,640,604,570,538,508,480,453
- dc.w 428,404,381,360,339,320,302,285,269,254,240,226
- dc.w 214,202,190,180,170,160,151,143,135,127,120,113 ;0
- dc.w 850,802,757,715,674,637,601,567,535,505,477,450
- dc.w 425,401,379,357,337,318,300,284,268,253,239,225
- dc.w 213,201,189,179,169,159,150,142,134,126,119,113 ;1
- dc.w 844,796,752,709,670,632,597,563,532,502,474,447
- dc.w 422,398,376,355,335,316,298,282,266,251,237,224
- dc.w 211,199,188,177,167,158,149,141,133,125,118,112 ;2
- dc.w 838,791,746,704,665,628,592,559,528,498,470,444
- dc.w 419,395,373,352,332,314,296,280,264,249,235,222
- dc.w 209,198,187,176,166,157,148,140,132,125,118,111 ;3
- dc.w 832,785,741,699,660,623,588,555,524,495,467,441
- dc.w 416,392,370,350,330,312,294,278,262,247,233,220
- dc.w 208,196,185,175,165,156,147,139,131,124,117,110 ;4
- dc.w 826,779,736,694,655,619,584,551,520,491,463,437
- dc.w 413,390,368,347,328,309,292,276,260,245,232,219
- dc.w 206,195,184,174,164,155,146,138,130,123,116,109 ;5
- dc.w 820,774,730,689,651,614,580,547,516,487,460,434
- dc.w 410,387,365,345,325,307,290,274,258,244,230,217
- dc.w 205,193,183,172,163,154,145,137,129,122,115,109 ;6
- dc.w 814,768,725,684,646,610,575,543,513,484,457,431
- dc.w 407,384,363,342,323,305,288,272,256,242,228,216
- dc.w 204,192,181,171,161,152,144,136,128,121,114,108 ;7
- dc.w 907,856,808,762,720,678,640,604,570,538,508,480
- dc.w 453,428,404,381,360,339,320,302,285,269,254,240
- dc.w 226,214,202,190,180,170,160,151,143,135,127,120 ;-8
- dc.w 900,850,802,757,715,675,636,601,567,535,505,477
- dc.w 450,425,401,379,357,337,318,300,284,268,253,238
- dc.w 225,212,200,189,179,169,159,150,142,134,126,119 ;-7
- dc.w 894,844,796,752,709,670,632,597,563,532,502,474
- dc.w 447,422,398,376,355,335,316,298,282,266,251,237
- dc.w 223,211,199,188,177,167,158,149,141,133,125,118 ;-6
- dc.w 887,838,791,746,704,665,628,592,559,528,498,470
- dc.w 444,419,395,373,352,332,314,296,280,264,249,235
- dc.w 222,209,198,187,176,166,157,148,140,132,125,118 ;-5
- dc.w 881,832,785,741,699,660,623,588,555,524,494,467
- dc.w 441,416,392,370,350,330,312,294,278,262,247,233
- dc.w 220,208,196,185,175,165,156,147,139,131,123,117 ;-4
- dc.w 875,826,779,736,694,655,619,584,551,520,491,463
- dc.w 437,413,390,368,347,328,309,292,276,260,245,232
- dc.w 219,206,195,184,174,164,155,146,138,130,123,116 ;-3
- dc.w 868,820,774,730,689,651,614,580,547,516,487,460
- dc.w 434,410,387,365,345,325,307,290,274,258,244,230
- dc.w 217,205,193,183,172,163,154,145,137,129,122,115 ;-2
- dc.w 862,814,768,725,684,646,610,575,543,513,484,457
- dc.w 431,407,384,363,342,323,305,288,272,256,242,228
- dc.w 216,203,192,181,171,161,152,144,136,128,121,114 ;-1
- mt_chan1temp dc.l 0,0,0,0,0,$00010000,0, 0,0,0,0, 0
- mt_chan2temp dc.l 0,0,0,0,0,$00020000,0, 0,0,0,0, 0
- mt_chan3temp dc.l 0,0,0,0,0,$00040000,0, 0,0,0,0, 0
- mt_chan4temp dc.l 0,0,0,0,0,$00080000,0, 0,0,0,0, 0
- mt_samplestarts dcb.l 31
- mt_speed dc.b 6
- mt_counter dc.b 0
- mt_songpos dc.w 0
- mt_pbreakpos dc.b 0
- mt_posjumpflag dc.b 0
- mt_pbreakflag dc.b 0
- mt_lowmask dc.b 0
- mt_pattdeltime dc.b 0
- mt_pattdeltime2 dc.b 0
- mt_maxvol dc.b 64 ;maximum volume
- dc.b 0 ;unsed
- mt_patternpos dc.w 0
- mt_dmacontemp dc.w 0
- mt_oldirq dc.l 0
- mt_pm dcb.w 16
- mt_dataptr dc.l mt_data ;pointer auf sound
-
-
- section "sound",data_c
-
- incdir df0:
- mt_data incbin mod.testmodul.pm
-